#include "TPlaca.h"

int Placa_Crear(TPlaca* placa, TDireccion dir) {
	if (PLACA_DEBUG) printf ("Placa_Crear: dir = %d\n", dir);

    if ((dir > DIR_MIN) && (dir < DIR_MAX)) {
        if (PLACA_DEBUG) printf("Placa_Crear: entro al if\n");
        placa->direccion = dir;
        placa->buffer_lleno = 0;

        if (PLACA_DEBUG) printf("Placa_Crear: placa->direccion = %d\n", placa->direccion);

		return PLACA_OK;
	}
    else {
        return PLACA_ERR_RANGO;
	}
}

int Placa_Destruir(TPlaca* placa){
	return PLACA_OK;
}
TDireccion Placa_GetDireccion(TPlaca* placa) {
	if (PLACA_DEBUG) {
		printf("Placa_GetDireccion: placa = %x\n", placa);
		printf("Placa_GetDireccion: placa->direccion = %d\n", placa->direccion);
	}
	return placa->direccion;
}

int Placa_Recibir(TPlaca* placa, void* mensaje, size_t tam) {
	TDireccion origen, destino;
	char texto[MAX_DATOS];
	
	if (PLACA_DEBUG) printf("Placa_Recibir: mensaje = %s\n", mensaje);
	
	if (strlen(mensaje) > MTU)
		return PLACA_ERR_OVERFLOW;

	sscanf(mensaje, "%d %d %[A-Z, a-z, ]", &origen, &destino, &texto);
	
	if (PLACA_DEBUG) {
		printf("Placa_Recibir:\n origen = %d\n destino = %d\n texto = %s\n", origen, destino, texto);
		printf("Placa_Recibir: (destino == placa->direccion)? %d\n", (destino == placa->direccion));
		printf("Placa_Recibir: (destino == DIR_BROADCAST)? %d\n", (destino == DIR_BROADCAST));
	}
	
	if ((destino == placa->direccion) || (destino == DIR_BROADCAST)) {
		if (PLACA_DEBUG) printf("Placa_Recibir: entra al if\n");
		if (!(placa->mensaje = malloc(tam))) 
			return PLACA_ERR_MEMORIA;
		
		strcpy(placa->mensaje, texto);
		if (PLACA_DEBUG) printf("Placa_Recibir: placa->mensaje = %s\n", placa->mensaje);
		return PLACA_OK;
	}
	else {
		return PLACA_ERR_DIRECCIONDISTINTA;
	}
}

int Placa_Enviar(TPlaca* placa, void* mensaje, size_t tam, TDireccion destino) {
	if (PLACA_DEBUG) printf("Placa_Enviar:\n mensaje = %s\n tam = %d\n destino = %d\n", (char*)mensaje, tam, destino);
	if (!Medio_Transmitir(placa->medio, mensaje, tam))
		return PLACA_OK;
	else
		return PLACA_ERR_ENVIAR;
}

size_t Placa_Leer(TPlaca* placa, void* destino) {
	return PLACA_OK;
}

int Placa_Conectar(TPlaca* placa, TMedio* medio) {
    int codigo_error;
    placa->medio = medio;
    if (!(codigo_error = Medio_Conectar(placa->medio,placa)))
    	return PLACA_OK;
    else
        return codigo_error;
}

int Placa_Desconectar(TPlaca* placa) {
	return PLACA_OK;
}
